#include "Label.h"
#include "Logger.h"

#include <iostream>

using namespace std;

void Label::inicializar(const char* text, int size){
	int height, width;

	//inicializo la fuente
	this->font = TTF_OpenFont(DEFAULT_FONT, size);
	
	if(!this->font){
		std::stringstream ss;
		ss << "No se pudo cargar la fuente " << DEFAULT_FONT ;
		Logger::getInstance()->err(ss.str());
		Logger::getInstance()->flush();
		exit(EXIT_CODE_TTF_ERROR);
	}

	//establezco el color de texto por default
	this->setTextColor(DEFAULT_TEXT_COLOR_R, DEFAULT_TEXT_COLOR_G, DEFAULT_TEXT_COLOR_B);

	//inicializo el puntero al texto
	this->text = NULL;

	//calculo las dimensiones
	TTF_SizeUNICODE(this->font, (Uint16*)text, &width, &height);

	//
	setHeight(height);
	setWidth(width*2);

	//establezco el texto
	setText(text);

	//inicializo la superficie donde se dibujara el texto
	this->textSurface = NULL;
}

Label::Label(const char* text, int size):Widget(){
	this->inicializar(text,size);
}

Label::Label(const char* text):Widget(){
	this->inicializar(text,DEFAULT_SIZE);
}

string* const Label::getText(){
	return this->text;
}

void Label::setText(const char* text){

	//destruyo el texto anterior (de ser necesario)
	if(this->text != NULL)
		delete this->text;

	//guardo el texto nuevo
	this->text = new string(text);
}

void Label::draw(SDL_Surface* screen, const int& x, const int& y){
	SDL_Rect offset;
	offset.x = x;
	offset.y = y;

	//si ya habia sido dibujado libero la superficio anterior
	if(textSurface != NULL)
		SDL_FreeSurface(textSurface);

	textSurface = TTF_RenderText_Solid(font, text->c_str(), this->getTextColor());

	SDL_BlitSurface(textSurface, NULL, screen, &offset);
}

TTF_Font* Label::getFont(){
	return font;
}

void Label::setTextColor(const int& red, const int& green, const int& blue){
	this->textColor.r = red;
	this->textColor.g = green;
	this->textColor.b = blue;
}

void Label::setTextColor(const SDL_Color& color){
	this->textColor = color;
}

SDL_Color Label::getTextColor(){
	return this->textColor;
}

Label::~Label() {

	//libero la memoria usada para guardar el texto
	delete this->text;

	// Libero la superficie del texto
	SDL_FreeSurface(this->textSurface);

	//destruyo la fuente
	TTF_CloseFont(font);
}
